// 解题思路： 
// 前提条件：首先得维护一个map 映射关系  来确定 '(' ')',  '[' ']' , '{' '}' 的关系
// 其次维护一个stack 栈，只需要对栈顶 和 对要添加如的数进行比较是否是匹配的(括号)匹配

// 核心思想：每次只需要对栈顶 和 对要添加如的数进行比较，如果满足条件，则匹配括号，条件成立

var isValid = function (s) {
    // 清除所有空格    
    let str = s.split(' ').join('')
    //  如果全为空字符串则返回true   
    if (str === '') {
        return true
    }
    let len = s.split(' ').join('').length
    // 如果是奇数并且是]})开头则返回false
    if (len % 2 !== 0 || str[0] === ')' || str[0] === '}' || str[0] === ']') {
        return false
    }
    // 创建一个栈
    let stack = []
    let current = null
    let top = str[0]
    let map = {
        ')': '(',
        ']': '[',
        '}': '{'
        // '(': 1,
        // ')': -1,
        // '[': 2,
        // ']': -2,
        // '{': 3,
        // '}': -3
    }
    for (let i = 0; i < str.length; i++) {
        current = str[i]
        top = stack[stack.length - 1] || null  // 栈顶
        // 如果栈顶元素和当前遍历元素相同则出栈否则入栈
        if (map[current] === top) { // map[current] + map[top] == 0  不可以无法确定 []}{ 这种情况
            // 这样就能保证了map[current] === top
            stack.pop()
        } else {
            stack.push(current)
        }
    }
    return stack.length === 0
};